# -*- coding:utf-8 -*-

from sklearn.datasets import load_iris,load_boston
from sklearn.feature_selection import VarianceThreshold
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression,SGDRegressor,Ridge
from sklearn.metrics import mean_squared_error
import joblib
import pandas as pd
import numpy as np
import sys
import pypinyin
sys.path.append("../")
from frameworks.utils.PadasExcelUtil import *
import re
import nums_from_string
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.decomposition import PCA
from scipy.stats import pearsonr

def main():
    fields = "代码	    名称	涨幅	现价	涨跌	涨停次数[20230510-20230515]	换手	振幅	涨速	总金额	总市值	流通市值	总手	利好	利空	主力净量	市盈(动)	TTM市盈率	市净率	开盘	昨收	最高	最低	委比%	量比	金叉个数	手/笔	外盘	涨停原因类别[20230512]	首次涨停时间[20230512]	最终涨停时间[20230512]	连续涨停天数[20230512]	涨停封单额[20230512]	涨停封成比%[20230512]	涨停开板次数[20230512]	流通市值[20230512]	dde大单净量%[20230512]	主力增仓占比%[20230515]	主力买入金额[20230512]	主力资金流向[20230512]	首发实际募集资金	营业收入[20230331]	现金分红比例%[20220630]	实际融资金额合计	销售毛利率%[20230331]	总资产报酬率roa%[20230331]	营业收入同比增长[20230331]	经营活动产生的现金流量净额[20230331]	机构股东成本价[20230331]	机构净额合计[20230515]	机构持股占流通股比例%[20230331]	营业总收入复合年增长率%[20221231]	净资产收益率%[20230331]	市盈率(pe)[20230512]	市净率[20230512]	总市值[20230512]	营业利润[20230331]	每股现金流量净额[20230331]	所属行业	细分行业	技术形态	散户数量	多空比	异动类型	5日涨幅	10日涨幅	20日涨幅	利润总额	每股盈利	净利润增长率	每股净资产	资产负债比率	流动资产	净利润？	每股公积金	主营业务收入	应收账款	扣非净利润	人均持股数	股东总数	"
    """
    岭回归对波士顿房价进行预测
    :return:
    """
    # 1）获取数据
    excel = PadasExcelUtil("Table.xls", "html")
    content = excel.getAllData()
    arr = np.array(content)
    data = []
    for i in range(0, len(arr)):
        val = []
        for m in arr[i][0].split("\t"):
            numbers = nums_from_string.get_nums(m)
            if len(numbers) > 0:
                val.append("".join('%s' %id for id in numbers))
            else:
                val.append("0")
        data.append(val)

    df = pd.DataFrame(data,columns=fields.split("\t"))
    print("特征数量：\n", df.shape)

    """
    # 2、实例化一个转换器类
    transfer = VarianceThreshold(threshold=10)

    data = df.iloc[:,:]

    print("data:\n", data)

    # 3、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new, data_new.shape)

    # 计算某两个变量之间的相关系数
    r1 = pearsonr(data["最高"], data["最低"])
    print("radio与earn之间的相关性：\n", r1)
    """

    newdf = df.drop(['5日涨幅','10日涨幅','20日涨幅','代码',"    名称","涨幅","现价","涨跌"], 1)

    df['5日涨幅'] = df.apply(lambda row: 0 if float(row['5日涨幅'].replace("%","")) > 0.1 else 1, axis = 1)

    # 2）划分数据集
    x_train, x_test, y_train, y_test = train_test_split(newdf, df["5日涨幅"], random_state=22)

    # 3）标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    #4）预估器
    estimator = RandomForestClassifier()
    # 加入网格搜索与交叉验证
    # 参数准备
    #param_dict = {"n_estimators": [120, 200, 300, 500, 800, 1200], "max_depth": [5, 8, 15, 25, 30]}
    param_dict = {"n_estimators": [300], "max_depth": [8]}
    estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
    estimator.fit(x_train, y_train)

    # 保存模型
    #joblib.dump(estimator, "my_ridge.pkl")
    # 加载模型
    #estimator = joblib.load("my_ridge.pkl")

    # 5）得出模型
    #print("岭回归-权重系数为：\n", estimator.coef_)
    #print("岭回归-偏置为：\n", estimator.intercept_)

    # 5）模型评估
    # 方法1：直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print(y_predict)

    # 方法2：计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为：\n", score)

    # 最佳参数：best_params_
    print("最佳参数：\n", estimator.best_params_)
    # 最佳结果：best_score_
    print("最佳结果：\n", estimator.best_score_)
    # 最佳估计器：best_estimator_
    print("最佳估计器:\n", estimator.best_estimator_)
    # 交叉验证结果：cv_results_
    print("交叉验证结果:\n", estimator.cv_results_)

if __name__ == "__main__":
    main()